RoR_chapter6 Railsの全体像を理解する
RoR_chapter6 Railsの全体像を理解する
Railsを取り巻く世界
ルーティングについて
以下の3つが基本
どのようなURLへ
どのようなHTTPメソッドでアクセスされたら
どのコントローラのアクションを呼ぶか
Railsのルーティングは少し複雑
基本的にはRESTfulに従うが、その限りでない実装をすることもできる
routes.rbを理解する
HTTPメソッド
GET, POST, PUT...
サーバへのリクエストの際に指定する情報の送信・取得方法
一般的にブラウザからはGET, POSTしか送ることができない
ただしRailsではmethodというリクエストパラメータの値にPATCHPUTDELETEという文字列が入ったPOSTリクエストは、その値のリクエストとして解釈するようにできている
URLパターン
/tasks, /tasks/:idなど
URLそのもの
:idのように一部に任意の文字が入るパターンの指定のこと
URLパターンの名称
new_task, tasksなど
定義したURLパターンごとに一意な名前をつけられる
上記の名前をもとに、対応するURLを生成するためのnew_task_path, new_task_urlなどのヘルパーメソッドが自動で用意される。
コントローラ
tasksなど
呼び出すアクションのコントローラを指定する
アクション
indexなど
呼び出すアクションを指定する
上記5つの関係
HTTPメソッド
URLパターン
URLパターンからコントローラへと繋がり、アクションが起動する
URLパターンを参照し、URLパターン名が生成
URLヘルパーメソッド tasks_pathなどの生成
ルートの定義について
code:routes.rb
get '/login', to: 'sessions#new'
意味
GETメソッドで、
/loginというURLに対してリクエストが来た場合、
SessionsControllerのnewアクションを呼び出す
また、/loginというURLをlogin_pathというヘルパーメソッドで生成できるようにする
URLパターン名は定義されていないが、URLの内容からloginという名前で判断され、認識されている
code:routes.rb
post '/login', to: 'sessions#create'
意味
POSTで/loginにリクエストが来た場合、SessionsControllerのcreateを呼ぶ
URLパターン名とヘルパーメソッドについて
これは上記と同じ、loginとlogin_pathとなる。
HTTPメソッドが違うだけで同じURLなので、生成されるものは変わらない
なのでnewを呼びたいならGETでloginを、createを呼びたいならPOSTでloginを呼び分ける感じ
↓こんな感じでアクション先は分かれているが、prefixは一緒というイメージ
table:rails routes
Prefix Verb URI Pattern Controller#Action
login GET /login(.:format) sessions#new
POST /login(.:format) sessions#create
logout DELETE /logout(.:format) sessions#destroy
RESTfulのおさらい
RESTという設定原則があり、それに従うシステムのこと
1. HTTPリクエストはそのリクエストで必要な情報を持ち、前のリクエストからの状態を保存する必要がない
2. 個々の情報への操作の表現が、HTTPメソッドとして統一されている(Railsのルーティングで重要な要素)
3. 個々の情報がそれぞれ一意なURIである
4. ある情報から別の情報を参照したいときは、リンクを利用する
RailsはアプリケーションをRESTfulなシステムとして開発しやすくする機能を多く提供する
Railsでは、URLが表す情報の1単位をリソースと呼ぶ。
/tasks/3というURLならば、3という一意な識別子を持つtaskというリソースである
2の条件に従うため、GET/POSTの2種だけでなく、PUT, PATCH, DELETEといったHTTPメソッドのサポート。
操作はHTTPメソッドでやるものだという理念がある
URLはなるべくリソースの名前を表す形(名詞)として作るという発想を持つ
RESTfulにするための流儀
参照とは
リソースxxを取得したい、というリクエストのこと
取得したいならGETで、どのリソースを取得したいかを考える
タスクを取りたいのであれば、URLにそう書けば良い
→GET /tasksとか、GET /tasks/17とかで定義すればよい
登録の実行について
いわゆるcreateアクション
参照とは違い、まだこの世に存在していない情報
新しい情報を作って送るイメージなので、POSTが使われる
タスクの情報を送りたいのであれば、URLにそう書けば良い
→POST /tasksという感じ。
ルート一式の定義について
resources :tasks
table:tasksの一覧
機能 HTTPメソッド URLパターン URLパターン名 ヘルパーメソッド アクション
一覧 GET /tasks tasks tasks_path index
詳細 GET /tasks/:id task task_path show
新規登録画面 GET /tasks/new new_task new_task_path new
登録 POST /tasks tasks tasks_path create
編集 GET /tasks/:id/edit edit_task edit_task_path edit
更新 PATCH もしくは PUT /tasks/:id task task_path update
削除 DELETE /tasks/:id task task_path destroy
HTTPメソッドとURLパターンの組み合わせのおかげで、Rails側がどのコントローラに渡すか判断できる。
code:html.slim
.container
https://scrapbox.io/files/651eaeb7b37ae1001be8e1e3.png
こんな感じで出力されるが、メソッドを指定してやれば/tasksというURLでも一覧にも飛ぶし登録にも飛んでくれる。
自分でルーティングの定義をする
code:routes.rb
resources :tasks do
collection do
get 'export'
end
end
こう書いた場合
/tasks/exportというURLを、exportアクションに紐付ける
URLパターン名はexport_tasksとなる
code:rb
# こうルーティングに書いたのであれば
resources :tasks do
collection do
get 'test'
get 'export'
end
end
# slim側でこんな感じで呼べる
.container
https://scrapbox.io/files/651eb0bf4e0db2001b9c8e32.png
routes.rbの構造化
構造化、階層化するためのメソッドが用意されている
scope, namespace, controllerなど
code:routes.rb
namespace :admin do
resources :user
end
admin/users_controller.rbのCRUDを
/admin/usersのURL、admin_users_pathというURLヘルパーメソッドとして実現するということ
プロジェクトのroutes.rbを色々読み解いてみる(変数の固有名詞などは置き換えて)
as:
名前を指定できる
get 'exit', to: 'sessions#destroy', as: logout
この場合、/exitのパスがlogout_pathで呼べるようになる。
resources :seis, path: 'sei', only: [:index, :show], as: 'sen_seis' do
seis_controllerに存在するアクションへの定義。
sen_seis_pathというヘルパーメソッドで、
pathとして定義されている/seiが呼べるようになる。
on:
別のアクションを追加できる
code:例.rb
resources :comments do
get 'preview', on: :new
end
comments_controllerに存在するアクションへの定義。
/comments/new/previewというパスにアクセスした場合に、
comments#previewに飛ばすという意味合いになる
preview_new_comment_urlや、preview_new_comment_pathヘルパーも同時生成される
:collection
collection do ~ endの簡略系。
code:rb
resources :users, path: 'user', only: :index, :show, as: 'service_users' do get :search, on: :collection
...
この場合であれば、下記のように読める。
resources :users, path: 'user', only: [:index, :show], as: 'service_users' do
users_controllerに飛ばすアクション(index, show)への定義を行う
service_users_pathというヘルパメソッドで
/userが呼べるようになる
get :search, on: :collection
いつものアクション(indexとかedit以外)に、searchというアクションを作る
search_user_pathというヘルパーメソッドも同時に生成されるが、
as:で定義されているものに従うと正しくはsearch_service_users_pathとなる
触れてると確かにちょっとずつ読めるようになるかも。
折角PR見てるんだから見とくべきっぽい...
国際化(C6-3)
すぐに使う知識ではないので飛ばす。気になったら見る。
日時の扱い方
タイムゾーン
code:rails c
irb(main):001:0> Time.zone
# UTCの時間
irb(main):002:0> Time.zone.now
=> Fri, 13 Oct 2023 12:33:11 UTC +00:00
# class名の確認
irb(main):003:0> Time.zone.now.class
=> ActiveSupport::TimeWithZone
# タイムゾーンを変える
irb(main):004:0> Time.zone = "Asia/Tokyo"
=> "Asia/Tokyo"
irb(main):006:0> Time.zone.now
=> Fri, 13 Oct 2023 21:35:01 JST +09:00
DBに指定するcreated_atなども、Time.zoneで示された時間オブジェクトに該当するので操作できる。
code:rails
Task.first.created_at.class
# ActiveSupport::TimeWithZone と出る
タイムゾーンの設定
config/application.rbで色々設定ができる。
code:rb
module Taskleaf
class Application < Rails::Application
config.load_defaults 5.2
config.time_zone = 'Asia/Tokyo'
end
end
エラー処理について
画面の出し分けとか例外処理とか。知りたくなったら見返す。
Railsログ
ログレベルなどの設定はconfig/environments/development.rbなどでできる。
セキュリティについて
他の本で見れば良いので割愛。
production環境で立ち上げる
development環境、test環境で動いてもprod環境で動かないことはままあるので知っておくと良い。
アセットのプリコンパイル
prod環境では高速処理の実現のため、アセットパイプラインを実行し静的ファイルを生成しておく
jsやcssファイルを縮小化するフレームワークのこと。
これをプリコンパイルと呼ぶ
prod環境ではソースコードを更新した場合、必ずプリコンパイルが必要。
実行する
code:terminal
bin/rails assets:precompile
yarn install v1.22.19
info No lockfile found.
1/4 🔍 Resolving packages... 2/4 🚚 Fetching packages... 3/4 🔗 Linking dependencies... 4/4 🔨 Building fresh packages... success Saved lockfile.
✨ Done in 0.15s.
I, 2023-10-16T21:11:13.270126 #9596 INFO -- : Writing /Users/skoni/Desktop/study/genba_ruby_on_rails/3_chapter/taskleaf/public/assets/application-2ce4be7091e107321b51cb3095e5aaaf599858bf7492cf4546f7cf989d09566a.js I, 2023-10-16T21:11:13.270718 #9596 INFO -- : Writing /Users/skoni/Desktop/study/genba_ruby_on_rails/3_chapter/taskleaf/public/assets/application-2ce4be7091e107321b51cb3095e5aaaf599858bf7492cf4546f7cf989d09566a.js.gz I, 2023-10-16T21:11:13.326307 #9596 INFO -- : Writing /Users/skoni/Desktop/study/genba_ruby_on_rails/3_chapter/taskleaf/public/assets/application-945f1aed203a8f0d2f3a956264e35bfb0bfc96e79f04ea7bf32b0ba96afeed8d.css I, 2023-10-16T21:11:13.326513 #9596 INFO -- : Writing /Users/skoni/Desktop/study/genba_ruby_on_rails/3_chapter/taskleaf/public/assets/application-945f1aed203a8f0d2f3a956264e35bfb0bfc96e79f04ea7bf32b0ba96afeed8d.css.gz 実行することでpublic/assets/下にコンパイルされたjs, cssファイルが生成される。
静的ファイルの配信サーバを設定する
slimファイルなど
railsがブラウザに対して、動的にhtmlとして書き換えて配信する
public直下のファイルなど
rails配置されたものをそのまま静的に配信する機能がある
開発環境ならばこれで良い
本番の場合
静的ファイルの配信はNginxなどのwebサーバに担わせることが一般的
Railsのパフォーマンスを高めるため(動的な部分の高速化)に、担わせる。
静的ファイルの配信機能を切る
code:3_chapter/taskleaf/config/environments/production.rb
# trueにする必要がある
~/.bash_profileなどや直接書き換えてtrueに指定しておく。
prod環境のDBを作成する
code:database.yml
production:
<<: *default
database: taskleaf_production
username: taskleaf
やること
postgresqlにtaskleafというユーザーを追加する
パスワードをbash_profileへ書き込む。
code:txt
createuser -d -P taskleaf
Enter password for new role: password
Enter it again: password
code:txt
RAILS_ENV=production bin/rails db:create db:migrate /Users/skoni/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/digest-3.1.1/lib/digest.rb:20: warning: already initialized constant Digest::REQUIRE_MUTEX
/Users/skoni/.rbenv/versions/2.5.1/lib/ruby/2.5.0/digest.rb:6: warning: previous definition of REQUIRE_MUTEX was here
Created database 'taskleaf_production'
== 20230203134630 CreateTasks: migrating ======================================
-- create_table(:tasks)
-> 0.0032s
== 20230203134630 CreateTasks: migrated (0.0033s) =============================
== 20230213121807 ChangeTasksNameNotNull: migrating ===========================
-- change_column_null(:tasks, :name, false)
-> 0.0016s
== 20230213121807 ChangeTasksNameNotNull: migrated (0.0017s) ==================
== 20230802125802 CreateUsers: migrating ======================================
-- create_table(:users)
-> 0.0059s
== 20230802125802 CreateUsers: migrated (0.0059s) =============================
== 20230802131247 AddAdminToUsers: migrating ==================================
-- add_column(:users, :admin, :boolean, {:default=>false, :null=>false})
-> 0.0006s
== 20230802131247 AddAdminToUsers: migrated (0.0006s) =========================
== 20230907150009 AddUserIdToTasks: migrating =================================
-- execute("DELETE FROM tasks;")
-> 0.0003s
-- add_reference(:tasks, :user, {:null=>false, :index=>true})
-> 0.0022s
== 20230907150009 AddUserIdToTasks: migrated (0.0026s) ========================
config/master.keyの確認
prod環境でアプリを利用する場合に必要になる
prod環境用の秘密情報を複合するために利用する鍵情報のこと。
3_chapter/taskleaf/config/master.keyこの辺にある
ここに記載された内容を.envに書いておいても良い。
起動する
bin/rails s --environment=production
本来は上記手順をcapistranoなどで自動化するのが定石。
ある程度は学んだのであとは実務しっかりやれば身につきそう。